特色
- 苹果宣称 Swift 的特点是:快速、现代、安全、互动,而且明显优于 Objective-C 语言
- 可以使用现有的
Cocoa
和Cocoa Touch
框架 - Swift 取消了 Objective C 的指针及其他不安全访问的使用
- 舍弃 Objective C 早期应用
Smalltalk
的语法,全面改为句点表示法 - 提供了类似 Java 的名字空间(namespace)、泛型(generic)、运算对象重载(operator overloading)
- Swift 被简单的形容为 “没有 C 的 Objective-C”(Objective-C without the C)
常量&变量
|
|
- 小结
var
定义变量,设置之后可以修改let
定义常量,设置之后不可以修改- 语句末尾不用使用
;
- 在 Swift 中使用
print()
替代 OC 中的NSLog
print
的性能更好,后面会演示
定义 OC
对象
|
|
|
|
- 阶段性小结
- 在
Swift
中要实例化一个对象可以使用类名()
的格式,与OC
中的alloc/init
等价 OC
中的initWithXXX
在Swift
中通常可以使用类名(XXX: )
找到对应的函数OC
中的[UIColor redColor]
类方法,在Swift
中通常可以使用类名.XXX
找到对应的函数- 使用
let
修饰v
并且赋值,表示该常量的内存地址不允许修改,但是可以修改其内部的属性
- 当前对象的属性,不需要使用
self.
- 在
常量&变量的使用原则:尽量先用 let,只有需要变的时候,再用 var,能够更加安全
变量类型
|
|
- 阶段性小结
简单体验
|
|
- 阶段性小结
Swift
中没有 C 语言中的非零即真
概念- 在逻辑判断时必须显示地指明具体的判断条件
if
语句条件的()
可以省略- 但是
{}
不能省略 - Swift中提供了真正的Bool类型, true/false, 条件表达式的值必须是true/false
三目
|
|
- 阶段性小结
Swift
中的三目
运算保持了和 OC 一致的风格- 注意: 运算符之间需要有空格
- 提醒: 在Swift开发中三目运算符用得非常多
|
|
可选项
演练 1
|
|
- 阶段性小结
- 在
Swift
中,不是所有的对象实例化方法都会返回值,在实际开发中需要注意实例化函数的返回类型,例如:
- 在
|
|
* 如果有 `?` 表示该方法有可能无法实例化到正确的对象
* 这种函数返回的对象,被称为 `可选项`,即有可能有值,也有可能没有值
* 实际开发时,需要针对这种对象加以判断,并且在分支内部使用 `!`,指明改对象确实是存在的
* 相比在 `OC` 的开发,尤其在日常练习时,会给定一个能够运行的值,而在实际运行时,一旦条件不满足,会直接闪退,这样用户体验会非常不好
Swift
的设计者考虑到因为对类型的强制要求,会让代码很难看,因此提供了一个变通的解决方案
演练 2
|
|
阶段性小结
- 使用
if let 常量 = 可选构造函数
的方式能够确保分支内部常量一定是有值的 - 并且在分支内部不再需要使用
!
- 这是
Swift
代码中的一个非常重要的使用技巧
- 使用
提示
- 尽管
Swift
提供了类型校验的手段,但是要写出优雅
的 Swift 代码,还是需要多加练习的,否则一不小心就会出现分支嵌套层次很深的代码 - 有关
?
和!
的选择,可以借助 Xcode 的辅助工具,但是强烈建议每次遇到提示时,要多加思考,反复揣摩
- 尽管
演练3
|
|
- 阶段性小结
??
是一个非常有用的操作符,能够快速对nil
进行判断- 如果对象是
nil
,则使用??
后面的值代替前面的nil
值参与计算 - 在使用
??
时,整个部分需要使用()
包装 - 这一技巧在
UITableView
的数据源方法中尤为重要
循环
OC风格的 for
|
|
Swift风格的 for
|
|
- 阶段性小结
Swift
中使用in
关键字标示循环的范围0..<10
表示从0到90...10
表示从0到10- 注意之间不能出现空格
特殊写法
|
|
- 阶段性小结
- 如果不关心循环本身的索引,可以使用
_
忽略
- 如果不关心循环本身的索引,可以使用
数组
数组中保存的对象类型
|
|
- 阶段性小结
- 数组使用 [] 定义,这一点与 OC 相同
- 如果初始化时,所有内容类型一致,择数组中保存的是该类型的内容
- 如果初始化时,所有内容类型不一致,择数组中保存的是
NSObject
常见数组操作
|
|
- 阶段性小结
- 如果定义数组时指定了保存对象的类型,则不能向数组中添加其他类型的内容
- 可以使用
[String]()
let
定义的数组是不可变的
var
定义的数组是可变的
|
|
字符串
在 Swift 中绝大多数的情况下,推荐使用 String 类型
使用 String
的原因
String
是一个结构体,性能更高String
目前具有了绝大多数 NSString 的功能String
支持直接遍历
NSString
是一个OC
对象,性能略差Swift
提供了String
和NSString
之间的无缝转换
遍历字符串
|
|
字符串拼接
|
|
- 阶段性小结
- 直接在
""
中使用\(变量名)
的方式可以快速拼接字符串 - 小伙伴们再也不要考虑
stringWithFormat
了
- 直接在
格式化字符串
|
|
- 阶段性小结
- 在实际开发中,如果需要指定字符串格式,可以使用
String(format:...)
的方式 - 注意:后面的参数需要放在一个数组中
- 在实际开发中,如果需要指定字符串格式,可以使用
String & Range 的结合
以下是超级费劲的代码
|
|
建议写法
|
|
函数
简单演练
|
|
- 阶段性小结
- 函数定义格式:
func 函数名(参数: 参数类型...) -> 返回值 { // 代码实现 }
- 如果没有返回值,
-> 返回值
可以省略 ->
是一个很有意思的符号- 默认情况下,在调用函数时,第一个参数名是省略的
- 函数定义格式:
参数名的特殊处理
强制要求参数名
|
|
省略参数名
|
|
|
|
闭包
闭包和OC中的Block差不多
1.都是用来保存一段代码, 在适当的时候执行
2.一般用于做一些耗时操作
3.传递值12345678类型的格式: (形参列表)->返回值类型in的作用就是用于分隔需要执行的代码值的格式: { (形参列表)->返回值类型 in 需要执行的代码}
闭包和Block的区别:
- Block类似于匿名函数
- 闭包就是用来定义函数的, Swift中函数其实就是闭包
|
|
|
|
|
|
懒加载
- 格式:
|
|
- 懒加载的写法本质上是定义并执行一个闭包
|
|
|
|
属性
|
|
|
|
getter 和 setter
自定义 Person 类
|
|
getter & setter
|
|
- 在
Swift
中以上形式的 getter & setter 很少用
didSet
- 在 OC 中,我们通常希望在给某一个变量赋值之后,去做一些额外的操作
- 最经典的应用就是在自定义 Cell 的时候,通过模型的设置方法完成 Cell 的填充
|
|
计算型属性
|
|
- 只实现
getter
方法的属性被称为计算型属性,等同于 OC 中的ReadOnly
属性 - 计算型属性本身不占用内存空间
- 不可以给计算型属性设置数值
- 计算型属性可以使用以下代码简写
|
|
构造函数
注意点: 如果没有在构造方法中对属性进行初始化,
那么对象类型可以写?,基本数据类型最好直接赋值一个初始值
如果在构造方法中给属性赋了初始值, 那么就可以不用写?了,因为只要创建对象就一定会调用构造
方法, 只要调用构造方法那么属性就一定有值
|
|
|
|
析构函数
|
|
重写description
|
|
1.笨写法
|
|
2.标准写法123456789class NetworkTools: NSObject { // 这样写也是懒加载的 // 注意: 一定要写let, let本身就是线程安全的, 并且只能赋值一次 static let instance: NetworkTools = NetworkTools() class func shareNetworkTools() -> NetworkTools { return instance }}